package com.cmccsi.uc.session;

import com.thn.netty.chat.codec.IMPB;
import com.thn.netty.chat.server.LoginParam;

public interface ISessionManager {
	/**
	 * 通过userid获取sessionid
	 */
	Boolean GetSessionid(int ulUserid, String[] szSessionids, int usCount);

	/**
	 * 通过userid获取session
	 */
	SESSION GetSession(int ulUserid);

	/**
	 * 通过用户id找到用户session并发送数据 ＠返回值
	 */
	int SendData(int ulUserid, IMPB.Message data, int size, CONN[] ppConnOutput,
			int pConnOutputCount, int ucDeviceType);

	/**
	 * 通过用户id找到用户session并发送数据, bSendToMyConn:false表示不给发送方conn发送 ＠返回值
	 */
	int SendMsg(CONN pSenderConn, int ulUserid, IMPB.Message data, int size,
			Boolean bSendToMyConn, CONN[] ppConnOutput, int pConnOutputCount);

	/**
	 * 创建Session
	 */
	SESSION CreateSession();

	/**
	 * 销毁Session
	 */
	void DestroySession(SESSION pSession);

	/**
	 * 通过CONN增加Session
	 */
	Boolean AddSession(CONN pConn, LoginParam loginParam, Boolean pbAddLoginNum);

	/**
	 * 增加Session ＠GENERATE_KICK_OUT_FPTR函数需要给c->out_buf, c->out_buf_len赋值
	 */
	Boolean AddSession(SESSION pSession, Boolean pbAddLoginNum);

	/**
	 * 检查Session是否失去连接或超时
	 */
	void CheckSession(SESSION pSession);

	/**
	 * 清除所有Session
	 */
	void ClearSession();

	/**
	 * 删除某个Session
	 */
	Boolean RemoveSession(SESSION pSession, Boolean bRemoveFromMap,
			Boolean bLogout, int ulUserid, PresenceRedis pr, String pSessionId);

	/**
	 * 删除conn对应的某个Session
	 */
	Boolean RemoveSession(CONN pConn, Boolean bLogout, Boolean pbUserOffline);

	/**
	 * 获取此用户登录类型
	 * 
	 * @返回值是按位或的所有登录类型的复合值
	 */
	int GetUserLoginType(int ulUserid);

	/**
	 * 获取此连接登录设备类型
	 * 
	 * @返回值是登录设备类型
	 */
	int GetUserLoginDeviceType(CONN pConn);

	/**
	 * 获取此用户状态
	 * 
	 * @返回值是按位或的所有登录状态的复合值
	 */
	int GetUserStatus(CONN pConn, int ulUserid, int ucLoginType);

	/**
	 * 获取此用户状态
	 * 
	 * @返回值是以PC为主的状态
	 */
	int GetUserStatus(CONN pConn, int ulUserid);

	/**
	 * 设置此用户状态
	 */
	int SetUserStatus(CONN pConn, int ucLoginStatus);

	/**
	 * 设置此用户状态, singature and devicetype
	 */
	int SetUserPresence(CONN pConn, int ulUserid, PresenceRedis pr,
			int usSetWhichValue);

	/**
	 * 设置此用户状态, singature and devicetype
	 */
	int SetUserPresence(CONN pConn, PresenceRedis pr, int usSetWhichValue);

	/**
	 * 判断是否是IOS推送状态
	 */
	Boolean IsOnIOSPushStatus(int ulUserid, CONN pConn);

	/**
	 * 通过CONN获取userid
	 */
	int GetUserid(CONN pConn, LoginParam loginparam);

	/**
	 * 发送kickout命令
	 */
	Boolean SendKickOutCmd(CONN pConn, int kickout_param);
}
